import { ResultFail, type ResultTypes } from '@/resources/interface/ResultTypes'
import { ElNotification } from 'element-plus'
import ObjectUtils from '@/utils/ObjectUtils'
import request from '../utils/Request'

export class HttpResultUtil {
  /**
   * 封装异步通用方法
   * @param apiCall 需要执行的函数
   * @param showMessage 是否展示弹框
   */
  static awaitRequest = async (
    apiCall: () => Promise<ResultTypes>, // 需要执行的 API 请求函数
    showMessage: boolean
  ): Promise<ResultTypes> => {
    const result: ResultTypes = await apiCall() // 执行异步操作
    if (result.sign && showMessage) {
      ElNotification({
        type: 'success',
        message: result.message,
        duration: 1500
      })
    }
    return result
  }

  /**
   * 二次封装axios-get
   * @param url 请求路径
   * @param data 请求数据
   * @param showMessage 是否展示弹框
   */
  static awaitGet = async (
    url: string, // 需要执行的 API 请求函数
    data: any,
    showMessage: boolean
  ): Promise<ResultTypes> => {
    const result: ResultTypes = await this.get(url, data) // 执行异步操作
    if (result.sign && showMessage) {
      ElNotification({
        type: 'success',
        message: result.message,
        duration: 1500
      })
    }
    return result
  }

  /**
   * 二次封装axios-post
   * @param url 请求路径
   * @param data 请求数据
   * @param showMessage 是否展示弹框
   */
  static awaitPost = async (
    url: string, // 需要执行的 API 请求函数
    data: any,
    showMessage: boolean
  ): Promise<ResultTypes> => {
    const result: ResultTypes = await this.post(url, data) // 执行异步操作
    if (result.sign && showMessage) {
      ElNotification({
        type: 'success',
        message: result.message,
        duration: 1500
      })
    }
    return result
  }

  /**
   * 封装axios-get
   * @param url 路径
   * @param data 参数
   * @returns
   */
  private static async get<T>(url: string, data: T) {
    try {
      const res = await request({
        url: url,
        method: 'get',
        params: data
      })
      return res.data
    } catch (e: any) {
      return ObjectUtils.cloneDeep(ResultFail)
    }
  }

  /**
   * 封装axios-post
   * @param url 路径
   * @param data 参数
   * @returns
   */
  private static async post<T>(url: string, data: T) {
    try {
      const res = await request({
        url: url,
        method: 'post',
        data
      })
      return res.data
    } catch (e: any) {
      return ObjectUtils.cloneDeep(ResultFail)
    }
  }
}
